package co.gov.medellin.ssti.sub.service;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;

import javax.naming.NamingException;

import co.gov.medellin.ssti.sub.common.ConexionFactory;
import co.gov.medellin.ssti.sub.model.dao.DAOFactory;
import co.gov.medellin.ssti.sub.model.dao.IReporteTotalGrupoFamiliarDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.CondicionConsultaVO;
import co.gov.medellin.ssti.sub.model.vo.ReporteGrupoFamiliarVO;
import co.gov.medellin.ssti.sub.model.vo.ReporteTotalGrupoFamiliarVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;

public class ReporteTotalGrupoFamiliarService {
	/**
	 * Metodo que realiza la consulta para el reporte detallado Grupo Familiar.
	 * Realiza una llamada al procedimiento almacenado
	 * PCS_REPORTE_GRUPO_FAMILIAR.
	 * 
	 * @param criteria
	 *            objeto ReporteGrupoFamiliarVO que contiene los parametros para
	 *            la consulta. codeComuna: codigo de la comuna. codigoZona:
	 *            codigo de la zona. codeBarrio: codigo del barrio.
	 *            codeSubprograma: codigo del subprograma. codePrograma: codigo
	 *            del programa. desde: String fecha inicial ('dd/mm/yyyy').
	 *            hasta: fecha final ('dd/mm/yyyy').
	 * @param lFilters
	 *            Lista de los filtros seleccionados (
	 *            {@link co.gov.co.medellin.ssti.sub.model.vo.CondicionConsultaVO}
	 *            ) por el usuario a ser aplicados al reporte.
	 * @return Collection de ReporteTotalGrupoFamiliarVO.
	 * @throws SQLException
	 */
	public Collection<ReporteTotalGrupoFamiliarVO> findReportGrupoFamiliar(
			ReporteGrupoFamiliarVO criteria, List<CondicionConsultaVO> lFilters)
			throws DAOException {
		IReporteTotalGrupoFamiliarDAO reporteTotalGrupoFamiliarDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			reporteTotalGrupoFamiliarDAO = DAOFactory.getDAOFactory(
					DAOFactory.ORACLE).getReporteTotalGrupoFamiliarDAO(con);
			return reporteTotalGrupoFamiliarDAO.findReportGrupoFamiliar(
					criteria, lFilters);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (reporteTotalGrupoFamiliarDAO != null) {
				if (!reporteTotalGrupoFamiliarDAO.isConnClosed()) {
					reporteTotalGrupoFamiliarDAO.close();
				}
			}
		}
	}

	/**
	 * TODO:
	 * 
	 * @param codeGF
	 * @return
	 * @throws SQLException
	 */
	public Collection<ReporteTotalGrupoFamiliarVO> findIndividualReport(
			Long codeGF) throws DAOException {
		IReporteTotalGrupoFamiliarDAO reporteTotalGrupoFamiliarDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			reporteTotalGrupoFamiliarDAO = DAOFactory.getDAOFactory(
					DAOFactory.ORACLE).getReporteTotalGrupoFamiliarDAO(con);
			return reporteTotalGrupoFamiliarDAO.findIndividualReport(codeGF);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (reporteTotalGrupoFamiliarDAO != null) {
				if (!reporteTotalGrupoFamiliarDAO.isConnClosed()) {
					reporteTotalGrupoFamiliarDAO.close();
				}
			}
		}
	}

	/**
	 * Metodo que realiza la consulta para el reporte total Grupo Familiar,
	 * aplicando los criterios y los filtros para delimitar los resultados.
	 * 
	 * @param criteria
	 *            objeto ReporteGrupoFamiliarVO que contiene los parametros para
	 *            la consulta. codeComuna: codigo de la comuna. codigoZona:
	 *            codigo de la zona. codeBarrio: codigo del barrio.
	 *            codeSubprograma: codigo del subprograma. codePrograma: codigo
	 *            del programa. desde: String fecha inicial ('dd/mm/yyyy').
	 *            hasta: fecha final ('dd/mm/yyyy').
	 * @param lFilters
	 *            Lista de los filtros seleccionados (
	 *            {@link co.gov.co.medellin.ssti.sub.model.vo.CondicionConsultaVO}
	 *            ) por el usuario a ser aplicados al reporte.
	 * @return Collection de ReporteTotalGrupoFamiliarVO.
	 * @throws SQLException
	 */
	public Collection<ReporteTotalGrupoFamiliarVO> findTotalReportGrupoFamiliar(
			ReporteGrupoFamiliarVO criteria, List<CondicionConsultaVO> lFilters)
			throws DAOException {
		IReporteTotalGrupoFamiliarDAO reporteTotalGrupoFamiliarDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			reporteTotalGrupoFamiliarDAO = DAOFactory.getDAOFactory(
					DAOFactory.ORACLE).getReporteTotalGrupoFamiliarDAO(con);
			return reporteTotalGrupoFamiliarDAO.findTotalReportGrupoFamiliar(
					criteria, lFilters);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (reporteTotalGrupoFamiliarDAO != null) {
				if (!reporteTotalGrupoFamiliarDAO.isConnClosed()) {
					reporteTotalGrupoFamiliarDAO.close();
				}
			}
		}
	}

	/**
	 * Metodo que consulta los programas y beneficios a los que tiene permiso el
	 * usuario sin tener encuenta la vigencia.
	 * 
	 * @param codeUser
	 *            Codigo del usuario.
	 * @param userGroupName
	 *            Nombre del grupo de usuarios al que pertenece el usuario en
	 *            paoyer.
	 * @param codeArea
	 *            Codigo del area.
	 * @return Collection de
	 *         {@link co.gov.medellin.ssti.sub.model.vo.SubprogramaVO}.
	 * @throws SQLException
	 */
	public Collection<SubprogramaVO> findProgSubprog(Long codeUser,
			String userGroupName, Long codeArea) throws DAOException {
		IReporteTotalGrupoFamiliarDAO reporteTotalGrupoFamiliarDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			reporteTotalGrupoFamiliarDAO = DAOFactory.getDAOFactory(
					DAOFactory.ORACLE).getReporteTotalGrupoFamiliarDAO(con);
			return reporteTotalGrupoFamiliarDAO.findProgSubprog(codeUser,
					userGroupName, codeArea);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (reporteTotalGrupoFamiliarDAO != null) {
				if (!reporteTotalGrupoFamiliarDAO.isConnClosed()) {
					reporteTotalGrupoFamiliarDAO.close();
				}
			}
		}
	}

	/**
	 * Metodo provisional para recuperar nombres de los filtros. TODO: parece
	 * como un metodo para completar atributos faltantes para construir criteria
	 * para los reportes de grupo familiar.
	 * 
	 * @param repGFVO
	 *            ReporteGrupoFamiliarVO
	 * @return
	 * @throws SQLException
	 */
	public ReporteGrupoFamiliarVO findFilters(ReporteGrupoFamiliarVO repGFVO)
			throws DAOException {
		IReporteTotalGrupoFamiliarDAO reporteTotalGrupoFamiliarDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			reporteTotalGrupoFamiliarDAO = DAOFactory.getDAOFactory(
					DAOFactory.ORACLE).getReporteTotalGrupoFamiliarDAO(con);
			return reporteTotalGrupoFamiliarDAO.findFilters(repGFVO);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (reporteTotalGrupoFamiliarDAO != null) {
				if (!reporteTotalGrupoFamiliarDAO.isConnClosed()) {
					reporteTotalGrupoFamiliarDAO.close();
				}
			}
		}
	}
}
